#!/usr/bin/python
# -*- coding:UTF8 -*-
# 边界匹配 ^和$
import re

tel = '13811115888'
r = re.findall('^\d{11}$', tel)
print(r)

# 将abc打成一个组，{2}指的是重复几次，匹配abcabc
strA = 'abcabcabcxyzabcabcxyzabc'
r = re.findall('(abc)', strA)
print(r)
r = re.findall('(abc)(abc)', strA)
print(r)
r = re.findall('(abc){2}', strA)
print(r)
r = re.findall('(abc){3}', strA)
print(r)
r = re.findall('(abc)(xyz)', strA)
print(r)

# findall第三参数 re.I忽略大小写
# 多个模式之间用 | 连接在一起
# 1).re.I(re.IGNORECASE): 忽略大小写
# 2).re.M(MULTILINE): 多行模式，改变’^’和’$’的行为
# 3).re.S(DOTALL): 点任意匹配模式，改变’.’的行为
strA = 'abcFBIabzCIAabz'
r = re.findall('Fbi', strA, re.I)
print(r)
r = re.findall('cIa', strA, re.I)
print(r)

strA = 'abcFBI\nabzCIAabz'
r = re.findall('Fbi.{1}', strA, re.I | re.S)
print(r)
r = re.findall('Fbi.{2}', strA, re.I | re.S)
print(r)

# re.sub替换字符串
strA = 'abcFBIabzCIAabz'
r = re.sub('FBI', 'BBQ', strA)
print(r)
r = re.sub('abc', 'ABC', strA)
print(r)

# 把abc替换成bbj，第4参数写1，证明只替换第一次，默认是0（无限替换）
strA = 'abcFBIabcCIAabzabc'
r = re.sub('abc', 'bbj', strA)
print(r)
r = re.sub('abc', 'bbj', strA, 2)
print(r)
r = re.sub('abc', 'bbj', strA, 3)
print(r)
r = re.sub('abc', 'bbj', strA, 5)
print(r)
r = strA.replace('abc', 'BBJ')
print(r)
r = strA.replace('abc', 'BBJ', 2)
print(r)

# 拓展知识
strA = 'abcFBIabcFBIabzFBIFBI'
def replace():
    return "张三"
    # pass
r = re.sub('FBI', replace(), strA, 1)
print(r)
# 分析：如果找到了FBI这个子串，会将FBI当成参数传到形参中，pass是什么都没返回，所以FBI被空字符串代替了。
# 把函数当参数传到sub的列表里，实现把业务交给函数去处理，例如将FBI替换成$FBI$
strA = 'abcFBIabcFBIabzFBIFBI'
def replace(find):
    find_group = find.group()  # group（）在正则表达式中用于获取分段截获的字符串，获取到FBI
    return '$' + find_group + '$'
    # return '$' + '张三' + '$'
r = re.sub('FBI', replace, strA)
print(r)
